#coding=utf-8
# Copyright 2011 Andrey Stepashov <Andrey.Stepashov@gmail.com>
# Copyright 2012 Maxim Petrov <maximpetrov@yahoo.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 3 or any later version.

from filetree_panel import FileTreePanel, ListTree
from message_window import MessageWindow
from ok_cancel_window import OKCancelWindow
from repository import Repository
from commit_window import CommitWindow

import curses

class WorkDirPanel(FileTreePanel):
    """
    Класс работы с панелью рабочей директории
    """

    # Панель ревизии
    revision_panel = None

    __workdir = None
    # Горячие клавиши панели рабочей директории.
    # {номер F-клавиши: подпись, ...}
    hotkeys = {7: _(u'Deselect'), 5: _(u'Commit'), 4: _(u'Filter'), 6: _(u'Reset filter')}
    # Номер ревизии, содержимое которой отображается
    # (обычно None, потому что отображается рабочая копия)
    __revision = None

    def set_workdir(self, dir_name):
        """
        Функция установки текущей рабочей директории

        Аргументы:
        dir_name - новая рабочая директория
        """

        self.__workdir = dir_name
        self.set_revision_view(None)

    def set_revision_view(self, revision):
        """
        Функция переключает панель рабочей директории на отображение изменений
        в заданной ревизии и обратно

        Аргументы:
        revision - ревизия, изменения которой нужно вывести или None для возврата
        """

        if revision is not None:
            files = self._window.repo_util.get_changes_for_revision(revision)
        else:
            files = self._window.repo_util.get_files()
        self.__revision = revision
        self.set_files(files)
        FileTreePanel.handle_keypress(self, curses.KEY_HOME, False)

    def __commit(self):
        """
        Функция производит commit выделенных файлов
        """

        changed = False
        s_list = self.get_selected_files()
        good, deleted, unknown, ignored = self._window.repo_util.check_for_untracked(s_list)
        if len(deleted) > 0:
            ans = self._window.show_modal_window(OKCancelWindow(
                    _(u'Some of selected files were deleted. Remove them from version control?'), _(u'Remove')))
            if ans[u'button'] == u'OK':
                self._window.repo_util.remove_from_version_control(deleted)
                changed = True
                good += deleted
        if len(unknown) > 0:
            ans = self._window.show_modal_window(OKCancelWindow(
                    _(u'Some of selected files are not tracked. Add them to version control?'), _(u'Add')))
            if ans[u'button'] == u'OK':
                self._window.repo_util.add(unknown)
                changed = True
                good += unknown
        if len(ignored) > 0:
            self._window.show_modal_window(MessageWindow(_(u'Some of selected files was marked as ignored')))

        inf = self._window.show_modal_window(CommitWindow())
        button = inf[u'button']
        if button == u'OK':
            message = inf[u'message']
            self._window.repo_util.do_commit(good, message)
            return True
        return changed

    def _title(self):
        """
        Функция возвращающая заголовок
        """

        title = self.__workdir
        if self.__revision is not None:
            title += u':' + unicode(self.__revision)
        return title

    def handle_keypress(self, ch, uni):
        """
        Обработчик нажатия клавиши

        Аргументы:
        ch - нажатая клавиша
        uni - True, если ch - является символом Unicode, False - если нет (например,
        является кодом клавиши не являющейся буквой)
        """

        if ch == curses.KEY_F5:
            if self.__revision is None:
                if self.__commit():
                    self.set_revision_view(None)
        elif ch == curses.KEY_F12:
            try:
                if self.__revision is None:
                    files = self._window.repo_util.diff(self.get_curpath())
                    subhead1 = u':' + unicode(self._window.repo_util.get_parent(filename=self.get_curpath()))
                    subhead2 = u''
                else:
                    files = self._window.repo_util.diff(self.get_curpath(),
                                            rev1=self.__revision, changes=True)
                    subhead1 = u':' + unicode(self._window.repo_util.get_parent(self.__revision, filename=self.get_curpath()))
                    subhead2 = u':' + unicode(self.__revision)
            except Exception:
                pass
            else:
                self._window.show_diff_panel(files,
                    title=(self.get_curpath() + subhead1,
                           self.get_curpath() + subhead2))
        elif ch == int(self._window.settings.get(u'Keycodes', u'KEY_SHIFT_F12', False) or -1):
            if self.__revision is not None:
                try:
                    files = self._window.repo_util.diff(self.get_curpath(),
                        rev1=self.__revision)
                except Exception:
                    pass
                else:
                    self._window.show_diff_panel(files,
                        title=(self.get_curpath() + u':' + unicode(self.__revision),
                               self.get_curpath()))
        elif ch == int(self._window.settings.get(u'Keycodes', u'KEY_CONTROL_F12', False) or -1):
            try:
                if self.__revision is None:
                    file = self._window.repo_util.view(self.get_curpath())
                    subhead = u''
                else:
                    file = self._window.repo_util.view(self.get_curpath(),
                        rev=self.__revision)
                    subhead = u':' + unicode(self.__revision)
            except Exception:
                pass
            else:
                self._window.show_view_panel(file,
                    title=self.get_curpath() + subhead)
        # Нажат Esc в режиме просмотра ревизии
        elif ch == 27 and self.__revision is not None:
            self.set_revision_view(None)
        else:
            FileTreePanel.handle_keypress(self, ch, uni)
        if ch == ord('\n'):
            s_list = self.get_selected_files()
            if len(s_list) == 0:
                cur_path = self.get_curpath()
                if cur_path is not None:
                    self.revision_panel.view([self.get_curpath()])
        elif ch == curses.KEY_IC:
            s_list = self.get_selected_files()
            self.revision_panel.view(s_list)
